Окно.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ Окно+;
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(* НАЗНАЧЕНИЕ: вывод фразы "Открытое окно" через графическую оконную систему  *)
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ИСПОЛЬЗУЕТ
  ОБХОД;

(* Win API *)
ВИД
  ATOM    = ОБХОД.Цел16;
  WINBOOL = ЦЕЛ;
  LONG    = ЦЕЛ;
  DWORD   = ЦЕЛ;
  LONG_PTR= ЦЕЛ;
  LPARAM  = LONG_PTR;
  WPARAM  = LONG_PTR;
  LRESULT = LONG_PTR;
  UINT    = ЦЕЛ;
  HANDLE  = ЦЕЛ;
  HMODULE = HANDLE;
  HGDIOBJ = HANDLE;
  HINST   = HANDLE;
  HWND    = HANDLE;
  HDC     = HANDLE;
  HMENU   = HANDLE;
  HICON   = HANDLE;
  HCURSOR = HANDLE;
  HBRUSH  = HANDLE;
  LPCTSTR = ЦЕЛ;
  LPVOID  = ЦЕЛ;
  LPBYTE  = ЦЕЛ;
  LPCSTR  = ЦЕЛ;
  LPTSTR  = ЦЕЛ;
  WNDPROC = ЗАДАЧА* (_para1:HWND; _para2:UINT; _para3:WPARAM; _para4:LPARAM):LRESULT;
  STARTUPINFO = НАБОР
     cb           :DWORD;
     lpReserved   :LPTSTR;
     lpDesktop    :LPTSTR;
     lpTitle      :LPTSTR;
     dwX          :DWORD;
     dwY          :DWORD;
     dwXSize      :DWORD;
     dwYSize      :DWORD;
     dwXCountChars:DWORD;
     dwYCountChars:DWORD;
     dwFillAttribute:DWORD;
     dwFlags      :DWORD;
     wShowWindow  :ОБХОД.Цел16;
     cbReserved2  :ОБХОД.Цел16;
     lpReserved2  :LPBYTE;
     hStdInput    :HANDLE;
     hStdOutput   :HANDLE;
     hStdError    :HANDLE;
  КОН;
  POINT = НАБОР
     x:LONG;
     y:LONG;
  КОН;
  RECT = НАБОР
    Left,Top,Right,Bottom:ЦЕЛ;
  КОН;
  MSG = НАБОР
     hwnd   :HWND;
     message:UINT;
     wParam :WPARAM;
     lParam :LPARAM;
     time   :DWORD;
     pt     :POINT;
  КОН;
  PAINTSTRUCT = НАБОР
     hdc        :HDC;
     fErase     :WINBOOL;
     rcPaint    :RECT;
     fRestore   :WINBOOL;
     fIncUpdate :WINBOOL;
     rgbReserved:РЯД 32 ИЗ УЗКЦЕЛ;
  КОН;
  WNDCLASS = НАБОР
     style        :UINT;
     lpfnWndProc  :WNDPROC;
     cbClsExtra   :ЦЕЛ;
     cbWndExtra   :ЦЕЛ;
     hInstance    :HANDLE;
     hIcon        :HICON;
     hCursor      :HCURSOR;
     hbrBackground:HBRUSH;
     lpszMenuName :LPCTSTR;
     lpszClassName:LPCTSTR;
  КОН;

ПОСТ
  WM_PAINT            = 15;
  WM_DESTROY          = 2;
  DT_CENTER           = 1;
  DT_SINGLELINE       = 32;
  DT_VCENTER          = 4;
  CS_VREDRAW          = 1;
  CS_HREDRAW          = 2;
  IDC_ARROW           = 32512; 
  IDI_APPLICATION     = 32512;
  WHITE_BRUSH         = 0;
  WS_OVERLAPPEDWINDOW = 0CF0000H;
  CW_USEDEFAULT       = МИН(ЦЕЛ);
  SW_SHOW             = 5;
  MB_OK               = 0;

(* начало приложения *) 
ПОСТ
  имяПриложения="Глагол-приложение";

ПЕР
  CmdShow:ЦЕЛ;
  hInstance:HANDLE;

 
 

ЗАДАЧА GetModuleHandle(lpModuleName:LPCSTR):HMODULE;     ВЫЗОВ  "GetModuleHandleW"  ИЗ "kernel32.dll";
ЗАДАЧА GetStartupInfo(lpStartupInfo+:STARTUPINFO);       ВЫЗОВ  "GetStartupInfoW"   ИЗ "kernel32.dll";
ЗАДАЧА GetStockObject(_para1:ЦЕЛ):HGDIOBJ;               ВЫЗОВ  "GetStockObject"    ИЗ "gdi32.dll";
ЗАДАЧА BeginPaint(hWnd:HWND; lpPaint+:PAINTSTRUCT):HDC;  ВЫЗОВ  "BeginPaint"        ИЗ "user32.dll";
ЗАДАЧА GetClientRect(hWnd:HWND; lpRect+:RECT);           ВЫЗОВ  "GetClientRect"     ИЗ "user32.dll";
ЗАДАЧА EndPaint(hWnd:HWND; lpPaint+:PAINTSTRUCT);        ВЫЗОВ  "EndPaint"          ИЗ "user32.dll";
ЗАДАЧА PostQuitMessage(nExitCode:ЦЕЛ);                   ВЫЗОВ  "PostQuitMessage"   ИЗ "user32.dll";
ЗАДАЧА LoadIcon(hInstance:HINST; lpIconName:ЦЕЛ):HICON;  ВЫЗОВ  "LoadIconW"         ИЗ "user32.dll";
ЗАДАЧА LoadCursor(hInstance:HINST; lpCursorName:ЦЕЛ):HCURSOR;  ВЫЗОВ  "LoadCursorW" ИЗ "user32.dll";
ЗАДАЧА RegisterClass(lpWndClass+:WNDCLASS):КЛЮЧ;         ВЫЗОВ  "RegisterClassW"    ИЗ "user32.dll";
ЗАДАЧА ShowWindow(hWnd:HWND; nCmdShow:ЦЕЛ);              ВЫЗОВ  "ShowWindow"        ИЗ "user32.dll";
ЗАДАЧА UpdateWindow(hWnd:HWND);                          ВЫЗОВ  "UpdateWindow"      ИЗ "user32.dll";
ЗАДАЧА TranslateMessage(lpMsg+:MSG);                     ВЫЗОВ  "TranslateMessage"  ИЗ "user32.dll";
ЗАДАЧА DispatchMessage(lpMsg+:MSG);                      ВЫЗОВ  "DispatchMessageW"  ИЗ "user32.dll";
ЗАДАЧА CreateWindowEx(
     dwExStyle:DWORD;
     lpClassName-:ЦЕПЬ;
     lpWindowName-:ЦЕПЬ;
     dwStyle:DWORD;
     X,Y,nWidth,nHeight:ЦЕЛ;
     hWndParent:HWND; hMenu:HMENU; hInstance:HINST;
     lpParam:LPVOID):HWND;                              ВЫЗОВ  "CreateWindowExW"   ИЗ "user32.dll";
ЗАДАЧА MessageBox(
     hWnd:HWND;
     lpText-:ЦЕПЬ;
     lpCaption-:ЦЕПЬ;
     uType:UINT);                                       ВЫЗОВ  "MessageBoxW"       ИЗ "user32.dll";
ЗАДАЧА GetMessage(
     lpMsg+:MSG;
     hWnd:HWND;
     wMsgFilterMin:UINT;
     wMsgFilterMax:UINT):КЛЮЧ;                          ВЫЗОВ  "GetMessageW"       ИЗ "user32.dll";
ЗАДАЧА DefWindowProc(
     hWnd:HWND;
     Msg:UINT; wParam:WPARAM;
     lParam:LPARAM):LRESULT;                            ВЫЗОВ  "DefWindowProcW"    ИЗ "user32.dll";
ЗАДАЧА DrawText(
     hDC:HDC;
     lpString-:ЦЕПЬ;
     nCount:ЦЕЛ;
     lpRect+:RECT;
     uFormat:UINT);                                     ВЫЗОВ  "DrawTextW"         ИЗ "user32.dll";

 
 
(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА* ОконнаяЗадача(hwnd:HWND; message:UINT; wParam:WPARAM; lParam:LPARAM):LRESULT;
(* Вызывается из ОС *)
ПЕР
  hdc:HDC;
  paintStruct:PAINTSTRUCT;
  rect:RECT;
УКАЗ
  ВЫБРАТЬ message ИЗ
  | WM_PAINT:
      hdc:=BeginPaint(hwnd,paintStruct);
      GetClientRect(hwnd,rect);
      DrawText(hdc,"Открытое окно",-1,rect,DT_SINGLELINE+DT_CENTER+DT_VCENTER);
      EndPaint(hwnd,paintStruct)
  | WM_DESTROY:
      PostQuitMessage(0)
  ИНАЧЕ
    ВОЗВРАТ DefWindowProc(hwnd,message,wParam,lParam)
  КОН;
  ВОЗВРАТ 0
КОН ОконнаяЗадача;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА ПрописатьОкно():КЛЮЧ;
(* Прописывает окно в ОС *)
ПЕР
  wndClass:WNDCLASS;
УКАЗ
  wndClass.style:=CS_HREDRAW+CS_VREDRAW;
  wndClass.lpfnWndProc:=ОконнаяЗадача;
  wndClass.cbClsExtra:=0;
  wndClass.cbWndExtra:=0;
  wndClass.hInstance:=hInstance;
  wndClass.hIcon:=LoadIcon(0,IDI_APPLICATION);
  wndClass.hCursor:=LoadCursor(0,IDC_ARROW);
  wndClass.hbrBackground:=GetStockObject(WHITE_BRUSH);
  wndClass.lpszMenuName:=0;
  wndClass.lpszClassName:=ОБХОД.ПолучитьАдрес(имяПриложения);
  ВОЗВРАТ RegisterClass(wndClass)
КОН ПрописатьОкно;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА СоздатьОкно():HWND;
(* Создаёт оконный класс *)
ПЕР
  hwnd:HWND;
УКАЗ
  hwnd:=CreateWindowEx(0,имяПриложения,имяПриложения,WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInstance,0);
  ЕСЛИ hwnd # 0 ТО 
    ShowWindow(hwnd,CmdShow);
    UpdateWindow(hwnd)
  КОН;
  ВОЗВРАТ hwnd
КОН СоздатьОкно;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА Работа;
ПЕР
  msg:MSG;
  startupInfo:STARTUPINFO;
УКАЗ
  hInstance:=GetModuleHandle(0);
  GetStartupInfo(startupInfo);
  CmdShow:=startupInfo.wShowWindow;
  ЕСЛИ НЕ ПрописатьОкно() ТО 
    MessageBox(0,"отказ в ПрописатьОкно","",MB_OK);
    ВОЗВРАТ
  КОН;
  ЕСЛИ СоздатьОкно() = 0 ТО 
    MessageBox(0,"отказ в СоздатьОкно","",MB_OK);
    ВОЗВРАТ
  КОН;
  (* получение и обработка сообщений *)
  ПОКА GetMessage(msg,0,0,0) ВЫП
    TranslateMessage(msg);
    DispatchMessage(msg)
  КОН
КОН Работа;

(*────────────────────────────────────────────────────────────────────────────*)
УКАЗ
  Работа
КОН Окно.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы